# merge 合并
import pandas as pd
import numpy as np
# 有一个共同列，只能依据共同列对一匹配
df1 = pd.DataFrame({
    'name':['张三','李四','王五'],
    'id':[1,2,3],
    'age':[22,33,44]
})
df2 = pd.DataFrame({
    'id':[2,3,4],
    'sex':['男','女','男'],
    'job':['saler','ceo','programer']
})
print(df1)
print(df2)
print(pd.merge(df1,df2))
# 多对一
df3 = pd.DataFrame({
    'name':['张三','李四','王五'],
    'id':[1,2,2],
    'age':[22,33,44]
})
df4 = pd.DataFrame({
    'id':[2,3,4],
    'sex':['男','女','男'],
    'job':['saler','ceo','programer']
})
print(pd.merge(df3,df4))
# 多对多
df5 = pd.DataFrame({
    'name':['张三','李四','王五'],
    'id':[1,2,2],
    'age':[22,33,44]
})
df6 = pd.DataFrame({
    'id':[2,2,4],
    'sex':['男','女','男'],
    'job':['saler','ceo','programer']
})
print(pd.merge(df5,df6))
# 如果有多列名称相同，需要制定一列作为连接的字段
# 如果没有共同的列名，需要使用left_on /ringht_on来分别指定2个表中不同列作为连接字段
df7 = pd.DataFrame({
    'name':['张三','李四','王五'],
    'id':[1,2,2],
    'age':[22,33,44]
})
df8 = pd.DataFrame({
    'id2':[2,2,4],
    'sex':['男','女','男'],
    'job':['saler','ceo','programer']
})
print(pd.merge(df7,df8,left_on='id',right_on='id2'))
# 当左边列和右边index相同的时候，使用ringht_index = True
df9 = pd.DataFrame({
    'name':['张三','李四','王五'],
    'id':[1,2,2],
    'age':[22,33,44]
})
df10 = pd.DataFrame({
    'id2':[2,2,4],
    'sex':['男','女','男'],
    'job':['saler','ceo','programer']
})
print(pd.merge(df9,df10,left_index=True,right_index=True))
# 内连接,how = inner 外连接，how = outer会显示两个表的所有数据，
# 左连接 how = left 显示左边表的所有数据和右表的公共数据
# 右连接 how = ringht 显示右表所有数据和左表的公共数据
df11 = pd.DataFrame({
    'name':['张三','李四','王五'],
    'id':[1,2,2],
    'age':[22,33,44]
})
df12 = pd.DataFrame({
    'id':[2,3,4],
    'sex':['男','女','男'],
    'job':['saler','ceo','programer']
})
print(pd.merge(df11,df12,how='inner'))
print(pd.merge(df11,df12,how='outer'))
print(pd.merge(df11,df12,how='left'))
print(pd.merge(df11,df12,how='right'))